#ifndef PUBLICMYSQLAPI_H
#define PUBLICMYSQLAPI_H
//读取配置定义决定是否使用MYSQL
#include"PublicConfig.h"
#if USE_PUBLIC_MYSQL
#include<stdio.h>
#include<stdint.h>
#include<stdlib.h>

#ifndef _mysql_h
typedef struct st_mysql MYSQL;
typedef struct st_mysql_res MYSQL_RES;
typedef char** MYSQL_ROW;
#if defined(NO_CLIENT_LONG_LONG)
  typedef unsigned long my_ulonglong;
#elif defined (_WIN32)
  typedef unsigned __int64 my_ulonglong;
#else
  typedef unsigned long long my_ulonglong;
#endif
#endif
  
//2015.12.30增加结果集返回
//严禁在代码其他位置使用mysql_store_result

#if USE_MYSQL_FLAG_ACTIVE
//主动探测程序使用
#define MYSQL_NUM    3
#define MYSQL_BASE   0  //主库同时为报警库
#define MYSQL_UPLOAD 1  //上传库
#define MYSQL_EX     2  //额外入库,CURL上传库
#elif USE_MYSQL_FLAG_SWITCH
//交换机采集程序使用
#define MYSQL_NUM    4
#define MYSQL_BASE   0  //主库，采集信息及1min带宽
#define MYSQL_FLOW   1  //上传机房带宽，及1min带宽
#define MYSQL_UPLOAD 2  //上传主探测数据
#define MYSQL_EX     3  //上传主探测数据到备库
#define OpenBaseSql()   OpenMySQL(MYSQL_BASE)
#define OpenFlowSql()   OpenMySQL(MYSQL_FLOW)
#define OpenUploadSql() OpenMySQL(MYSQL_UPLOAD)
#define OpenExSql()     OpenMySQL(MYSQL_EX)
#elif USE_MYSQL_FLAG_COUNT
#define MYSQL_NUM    4
#define MYSQL_BASE   0  //主库
#define MYSQL_CACTI  1  //Cacti数据源
#define MYSQL_DB1    1  //数据库1,同时也是Cacti数据源
#define MYSQL_EM     2  //EM数据源
#define MYSQL_DB2    2  //数据库2
#define MYSQL_FLOW   3  //带宽存储库
#define OpenMySQLBase()     OpenMySQL(MYSQL_BASE)
#define OpenMySQLFlow()     OpenMySQL(MYSQL_FLOW)
#define OpenMySQLCacti()    OpenMySQL(MYSQL_CACTI)
#define OpenMySQLEm()       OpenMySQL(MYSQL_EM)
#define OpenMySQLDb1()      OpenMySQL(MYSQL_DB1)
#define OpenMySQLDb2()      OpenMySQL(MYSQL_DB2)
#else
//默认就主备2个  
#define MYSQL_NUM    2
#define MYSQL_BASE   0  //主库
#define MYSQL_BAK    1  //备库  
#endif

typedef struct _MySQLConf{
char     host[32];
char     hostbak[32];
char     user[32];
char     passwd[512];
uint16_t port;
char     db[128];
}MySQLConf;
MYSQL*OpenMySQL(int type);
MYSQL*CloseMySQL(MYSQL*mysql);
//检查服务器是否可用
//-1 不可用 0 可用
int CheckMySQLAlive(int type);
void InitMySQL();
void UnInitMySQL();
//直接直接无结果集返回
//发生指定错误执行指定语句重试
//1146 Table doesn't exist
int  RunMySQL(MYSQL*mysql,const char*sqlbuff,unsigned int check=0,const char*checksql=NULL);
//执行返回结果集,同时返回获取行数
MYSQL_RES*RunMySQLGetRes(MYSQL*mysql,const char*sqlbuff,my_ulonglong&resnum);
//显示结果集
void ShowMySQLRes(MYSQL_RES*res);
//释放结果集
MYSQL_RES*FreeMySQLRes(MYSQL_RES*res);
//获取执行线程ID
unsigned long MySQLThreadID(MYSQL*mysql);
//检查服务器是否存活
int MySQLPing(MYSQL*mysql);
//获取下一行数据
MYSQL_ROW MySQLFetchRow(MYSQL_RES*res);
//获取结果集
MYSQL_RES*MySQLStoreResult(MYSQL*mysql);
//获取数据行数
my_ulonglong MySQLNumRows(MYSQL_RES*res);
int MySQLErrno(MYSQL*mysql);
const char*MySQLError(MYSQL*mysql);
//将src中单引号,斜杠前前增加斜杠
int ReplaceMySqlStr(const char*src,char*dst,int len);
//数据定位
void MySQLDataSeek(MYSQL_RES*res,int pos);
//设置数据,是否需要解密
void SetMySQLConf(MySQLConf conf,int type,int bDec);
//获取配置信息
MySQLConf GetMySQLConf(int type);
//更新配置信息
void UpDateMySQLConf(const char*IP,const char*db,const char*descr,int type);
//显示结果
void ShowMySQLConf();
//显示执行SQL
void SetMySQLShowRunningSQL(int bShow);
//-1错误0未配置1正常
int IsMySQLConfAlive(int type);
//切换数据库，可选创建
int SelectMySQLDB(MYSQL*mysql,const char*db,int bCreate);
//-1不全0正常
int CheckSQLConf(MySQLConf conf);
//更新数据库配置,0正常，-1错误
int MySQLReadConfig(MySQLConf*conf,const char*key,const char*val);
#endif
#endif
